package utna.frba.ia.tp.cases.descifrador;

import java.util.ArrayList;
import java.util.Collection;

import org.jgap.FitnessFunction;
import org.jgap.IChromosome;

import utna.frba.ia.tp.cases.descifrador.reglas.definition.Funcion;
import utna.frba.ia.tp.cases.descifrador.reglas.impl.Regla5;
import utna.frba.ia.tp.cases.descifrador.reglas.impl.Regla18;
import utna.frba.ia.tp.cases.descifrador.reglas.impl.Regla15;
import utna.frba.ia.tp.cases.descifrador.reglas.impl.ReglaAdicional;


public class FuncionDeAptitudParaClaves extends FitnessFunction {

	private static final long serialVersionUID = 1L;
	private Collection<Funcion> reglas;

	public FuncionDeAptitudParaClaves() {
		reglas = this.createReglas();
	}
	
	@Override
	protected double evaluate(IChromosome chromosome) {
		double fitnessValue = 1;
		
		String key = this.getLiteralValueOfResult(chromosome);
		
		for (Funcion funcion : this.getReglas()) {
			fitnessValue += funcion.valueOf(key);
		}
		
		return fitnessValue > 0 ? fitnessValue : 1;
	}

	public Collection<Funcion> getReglas() {
		return this.reglas;
	}

	public String getLiteralValueOfResult(IChromosome bestSolutionSoFar) {
		String result = new String();
		
		for (int i = 0; i < 12; i++) {
			result += (String) bestSolutionSoFar.getGene(i).getAllele();
		}
		
		return result;
	}

	// ***************************************
	// DEFINICION DE REGLAS
	// ***************************************
	
	private Collection<Funcion> createReglas() {
		Collection<Funcion> toReturn = new ArrayList<Funcion>();
		
		toReturn.add(new Regla5());
		toReturn.add(new Regla15());
		toReturn.add(new Regla18());
		toReturn.add(new ReglaAdicional());
		
		return toReturn;
	}
	
}
